home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Mac Mania 5
/
MacMania 5.toast
/
/
Internet software
/
NewsWatcher
/
NW Source
/
Source
/
prefsdlog.c
< prev
next >
Wrap
Text File
|
1997-01-09
|
66KB
|
2,346 lines
/*----------------------------------------------------------------------------
prefsdlog.c
This module handles the preferences dialog.
Copyright © 1994-1997, Northwestern University.
----------------------------------------------------------------------------*/
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include "glob.h"
#include "prefsdlog.h"
#include "dialog.h"
#include "popuputil.h"
#include "sfutil.h"
#include "log.h"
#include "news.h"
#include "newswatcher.h"
#include "strutil.h"
#include "full.h"
#include "drawutil.h"
#include "memutil.h"
#include "fileutil.h"
#include "apputil.h"
#include "resutil.h"
#include "menus.h"
#include "url.h"
#include "ic.h"
#include "header.h"
#include "qsort.h"
#include "arrowpair.h"
#include "biglist.h"
/* Items common to all topics. The kInit and kTerm items are pseudo-items
used to intialize and terminate the topics. The OK and Cancel buttons
are also common to all topics (item numbers 1 and 2). Items 3 through
7 are user items to draw the 5 segments of the gray outline. Item 8
is the topic popup menu. Item 9 is the user item for the up and down
arrow controls. Item 10 is the help item for help balloons. Item 11 is
the user item to outline the OK button. */
#define kInit 100
#define kTerm 101
#define kFirstGrayLine 3
#define kLastGrayLine 7
#define kTopicPopup 8
#define kArrows 9
#define kCommonItems 11
/* Prefs dialog and DITL resources */
#define kPrefsDlg 300
#define kNewsreadingOptions 1
#define kServerAddresses 2
#define kServerOptions 3
#define kPersonalInfo 4
#define kSignature 5
#define kMessageOptions 6
#define kExtraHeaderLines 7
#define kRemoteHost 8
#define kScreenFonts 9
#define kPrintingFont 10
#define kSavedUserGroupLists 11
#define kSavedArticles 12
#define kSavedMessages 13
#define kURLHelpers 14
#define kAuthentication 15
#define kExtractBinaries 16
#define kMiscOptions 17
#define kNumTopics 17
/* Newsreading options topic. */
#define kShowAuthors (kCommonItems + 1)
#define kShowArtHeaders (kCommonItems + 2)
#define kCollapseThreads (kCommonItems + 3)
#define kKeyboardShortcuts (kCommonItems + 4)
#define kKeypadShortcuts (kCommonItems + 5)
#define kReuseArticleWinds (kCommonItems + 6)
#define kReturnToSubjectWindow (kCommonItems + 7)
#define kStopAtEndOfSubjectList (kCommonItems + 8)
#define kBeepAtEndOfLists (kCommonItems + 9)
#define kMaxArticles (kCommonItems + 11)
/* Server info topic. */
#define kNewsServer (kCommonItems + 3)
#define kMailServer (kCommonItems + 5)
/* Server options topic. */
#define kBatchedGroupCmds (kCommonItems + 2)
#define kUseXPAT (kCommonItems + 3)
#define kNoNewConnection (kCommonItems + 4)
#define kNoModeReader (kCommonItems + 5)
/* Personal info topic. */
#define kFullName (kCommonItems + 3)
#define kOrganization (kCommonItems + 5)
#define kMailAddress (kCommonItems + 7)
/* Signature topic. */
#define kSigStaticText (kCommonItems + 1)
#define kSignatureEditText (kCommonItems + 2)
#define kAddSigBlankLine (kCommonItems + 3)
#define kAddSigSeparator (kCommonItems + 4)
/* Message options topic. */
#define kMsgReplyPost (kCommonItems + 1)
#define kMsgReplyEmail (kCommonItems + 2)
#define kMsgCopySelf (kCommonItems + 3)
#define kMsgShowMsgDetails (kCommonItems + 4)
#define kMsgWrapOnSend (kCommonItems + 5)
#define kMsgShowLabels (kCommonItems + 6)
#define kMsgTabEnabled (kCommonItems + 7)
#define kMsgTabStops (kCommonItems + 9)
#define kMsgQuoteString (kCommonItems + 11)
/* Extra header lines topic */
#define kMsgExtraNewsHdrLines (kCommonItems + 2)
#define kMsgExtraMailHdrLines (kCommonItems + 4)
/* Remote host info topic. */
#define kRemoteHostAddr (kCommonItems + 3)
#define kRemoteLogin (kCommonItems + 5)
#define kRemotePassword (kCommonItems + 7)
#define kRemotePath (kCommonItems + 9)
#define kAutoGetPut (kCommonItems + 10)
#define kSavePassword (kCommonItems + 11)
/* Screen fonts topic. */
#define kListFontPopup (kCommonItems + 2)
#define kListSizeBox (kCommonItems + 4)
#define kListSizePopup (kCommonItems + 5)
#define kListSample (kCommonItems + 6)
#define kListVertLine (kCommonItems + 7)
#define kTextFontPopup (kCommonItems + 9)
#define kTextSizeBox (kCommonItems + 11)
#define kTextSizePopup (kCommonItems + 12)
#define kTextSample (kCommonItems + 13)
/* Printing font topic. */
#define kPrintingFontPopup (kCommonItems + 1)
#define kPrintingSizeBox (kCommonItems + 3)
#define kPrintingSizePopup (kCommonItems + 4)
#define kPrintingSample (kCommonItems + 5)
/* Saved user group lists topic. */
#define kSavedUGLDirCheckBox (kCommonItems + 1)
#define kSavedUGLDirBorder (kCommonItems + 2)
#define kSavedUGLDirName (kCommonItems + 3)
#define kSavedUGLDirButton (kCommonItems + 4)
#define kSavedUGLAutoSaveOnQuit (kCommonItems + 5)
/* Saved articles topic. */
#define kSavedArtAppBorder (kCommonItems + 2)
#define kSavedArtAppName (kCommonItems + 3)
#define kSavedArtAppButton (kCommonItems + 4)
#define kSavedArtDirCheckBox (kCommonItems + 5)
#define kSavedArtDirBorder (kCommonItems + 6)
#define kSavedArtDirName (kCommonItems + 7)
#define kSavedArtDirButton (kCommonItems + 8)
#define kSavedArtSepFiles (kCommonItems + 9)
#define kSavedArtAutoAppend (kCommonItems + 10)
#define kSavedArtSaveEncoded (kCommonItems + 11)
/* Saved messages topic. */
#define kSavedMsgDirCheckBox (kCommonItems + 1)
#define kSavedMsgDirBorder (kCommonItems + 2)
#define kSavedMsgDirName (kCommonItems + 3)
#define kSavedMsgDirButton (kCommonItems + 4)
#define kSavedMsgDelAfterSend (kCommonItems + 5)
/* URL helper programs topic. */
#define kURLList (kCommonItems + 1)
#define kURLChangeButton (kCommonItems + 2)
#define kURLDeleteButton (kCommonItems + 3)
#define kURLNewScheme (kCommonItems + 5)
#define kURLAddButton (kCommonItems + 6)
#define kURLUseWebHelper (kCommonItems + 7)
/* Authentication topic. */
#define kAuthUsername (kCommonItems + 3)
#define kAuthPassword (kCommonItems + 5)
#define kAuthSavePassword (kCommonItems + 6)
#define kAuthPrivateGroups (kCommonItems + 7)
#define kAuthWhenRequested (kCommonItems + 8)
#define kAuthAtStartup (kCommonItems + 9)
/* Extracting Binaries topic. */
#define kSavedBinDirCheckBox (kCommonItems + 1)
#define kSavedBinDirBorder (kCommonItems + 2)
#define kSavedBinDirName (kCommonItems + 3)
#define kSavedBinDirButton (kCommonItems + 4)
#define kHqxAppBorder (kCommonItems + 6)
#define kHqxAppName (kCommonItems + 7)
#define kHqxAppButton (kCommonItems + 8)
#define kUUAppBorder (kCommonItems + 10)
#define kUUAppName (kCommonItems + 11)
#define kUUAppButton (kCommonItems + 12)
/* Miscellaneous options topic. */
#define kReZoomWindows (kCommonItems + 1)
#define kCheckNewGroups (kCommonItems + 2)
#define kAreYouSure (kCommonItems + 3)
#define kLogActionsToFile (kCommonItems + 4)
#define kDontCoverFinderIcons (kCommonItems + 5)
#define kUseInternetConfig (kCommonItems + 6)
static short gItem; /* dialog item number hit */
static ArrowPairRef gArrowPair = nil; /* arrow pair reference */
static Str255 gStaticText; /* static text for signature dialog */
static short gListFontID; /* current list font id */
static short gListFontSize; /* current list font size */
static short gTextFontID; /* current text font id */
static short gTextFontSize; /* current text font size */
static short gPrintingFontID; /* current printing font id */
static short gPrintingFontSize; /* current printing font size */
static BigListRef gURLList; /* URL helpers list ref */
static Handle gURLListStrings; /* handle to URL helpers list strings */
static Boolean gScreenFontsTopic; /* true if screen fonts topic, false if printing font topic */
static Boolean gValid; /* Set to false by topic handling function
on kTerm call if one of the prefs values
is invalid. */
static FileFilterYDUPP gInvisibleFilesFilterUPP = nil;
static UserItemUPP gDrawFontSampleUPP = nil;
static UserItemUPP gDlgArrowsItemUPP = nil;
static UserItemUPP gDrawURLListUPP = nil;
/*----------------------------------------------------------------------------
ValidHelper
Check for a valid helper program.
Entry: fSpec = pointer to helper program file spec.
Exit: function result = true if helper is valid.
*fSpec = pointer to file spec for copy of helper program which
will actually be used if duplicate copies of helper found.
----------------------------------------------------------------------------*/
static Boolean ValidHelper (FSSpec *fSpec)
{
OSErr err = noErr;
FInfo fInfo;
FSSpec file;
CStr255 fmt, msg;
err = FSpGetFInfo(fSpec, &fInfo);
if (err != noErr) goto exit1;
if (fInfo.fdType != 'APPL') goto exit2;
err = FindAppFromSig(fInfo.fdCreator, &file, nil, nil);
if (err == fnfErr) goto exit3;
if (err != noErr) goto exit1;
if (!IsEqualFSSpec(fSpec, &file)) goto exit4;
return true;
exit1:
GetCString(kStrUnexpectedErr, fmt);
sprintf(msg, fmt, err);
StopAlertMessage(msg);
return false;
exit2:
StopAlertNumber(kStrNotAnApplication);
return false;
exit3:
StopAlertNumber(kStrDesktopDatabaseDamaged);
return true;
exit4:
CautionAlertNumber(kStrDuplicateCopiesOfHelper);
*fSpec = file;
return true;
}
/*----------------------------------------------------------------------------
NewsreadingOptions
Handle the newsreading options preferences dialog.
Entry: prefs = pointer to new prefs.
dlg = pointer to dialog.
item = item number hit.
Exit: function result = error code.
----------------------------------------------------------------------------*/
static OSErr NewsreadingOptions (TPrefRec *prefs, DialogPtr dlg, short item)
{
long maxFetch;
switch (item) {
case kInit:
DlgSetCheck(dlg, kShowAuthors, prefs->showAuthors);
DlgSetCheck(dlg, kShowArtHeaders, prefs->showArtHeaders);
DlgSetCheck(dlg, kCollapseThreads, prefs->showThreadsCollapsed);
DlgSetCheck(dlg, kKeyboardShortcuts, prefs->keyboardShortcuts);
DlgSetCheck(dlg, kKeypadShortcuts, prefs->keypadShortcuts);
DlgSetCheck(dlg, kReuseArticleWinds, prefs->reuseArticleWinds);
DlgSetCheck(dlg, kReturnToSubjectWindow, prefs->returnToSubjectWindow);
DlgSetCheck(dlg, kStopAtEndOfSubjectList, prefs->stopAtEndOfSubjectList);
DlgSetCheck(dlg, kBeepAtEndOfLists, prefs->beepAtEndOfLists);
DlgSetNumber(dlg, kMaxArticles, prefs->maxFetch);
SetItemNumeric(dlg, kMaxArticles);
SetItemMaxLength(dlg, kMaxArticles, 6);
SelectDialogItemText(dlg, kMaxArticles, 0, kMaxShort);
break;
case kTerm:
prefs->showAuthors = DlgGetCheck(dlg, kShowAuthors);
prefs->showArtHeaders = DlgGetCheck(dlg, kShowArtHeaders);
prefs->showThreadsCollapsed = DlgGetCheck(dlg, kCollapseThreads);
prefs->keyboardShortcuts = DlgGetCheck(dlg, kKeyboardShortcuts);
prefs->keypadShortcuts = DlgGetCheck(dlg, kKeypadShortcuts);
prefs->reuseArticleWinds = DlgGetCheck(dlg, kReuseArticleWinds);
prefs->returnToSubjectWindow = DlgGetCheck(dlg, kReturnToSubjectWindow);
prefs->stopAtEndOfSubjectList = DlgGetCheck(dlg, kStopAtEndOfSubjectList);
prefs->beepAtEndOfLists = DlgGetCheck(dlg, kBeepAtEndOfLists);
maxFetch = DlgGetNumber(dlg, kMaxArticles);
if (maxFetch <= 0 || maxFetch > kMaxMaxFetch) maxFetch = kMaxMaxFetch;
prefs->maxFetch = maxFetch;
break;
case kShowAuthors:
case kShowArtHeaders:
case kCollapseThreads:
case kKeyboardShortcuts:
case kKeypadShortcuts:
case kReuseArticleWinds:
case kReturnToSubjectWindow:
case kStopAtEndOfSubjectList:
case kBeepAtEndOfLists:
DlgToggleCheck(dlg, item);
break;
}
return noErr;
}
/*----------------------------------------------------------------------------
Server
Handles the server info preferences dialog.
Entry: prefs = pointer to new prefs.
dlg = pointer to dialog.
item = item number hit.
Exit: function result = error code.
----------------------------------------------------------------------------*/
static OSErr Server (TPrefRec *prefs, DialogPtr dlg, short item)
{
Boolean enable;
switch (item) {
case kInit:
DlgSetPString(dlg, kNewsServer, prefs->newsServerName);
SetItemHostAddress(dlg, kNewsServer);
SetItemMaxLength(dlg, kNewsServer, 255);
DlgSetPString(dlg, kMailServer, prefs->mailServerName);
SetItemHostAddress(dlg, kMailServer);
SetItemMaxLength(dlg, kMailServer, 255);
if (*prefs->newsServerName == 0) {
SelectDialogItemText(dlg, kNewsServer, 0, 0);
} else if (*prefs->mailServerName == 0) {
SelectDialogItemText(dlg, kMailServer, 0, 0);
} else {
SelectDialogItemText(dlg, kNewsServer, 0, kMaxShort);
}
break;
case kTerm:
break;
case kNewsServer:
case kMailServer:
DlgGetPString(dlg, kNewsServer, prefs->newsServerName);
DlgGetPString(dlg, kMailServer, prefs->mailServerName);
enable = *prefs->newsServerName != 0 && *prefs->mailServerName != 0;
DlgEnableItem(dlg, ok, enable);
DlgEnableItem(dlg, kTopicPopup, enable);
}
return noErr;
}
/*----------------------------------------------------------------------------
ServerOptions
Handles the server options preferences dialog.
Entry: prefs = pointer to new prefs.
dlg = pointer to dialog.
item = item number hit.
Exit: function result = error code.
----------------------------------------------------------------------------*/
static OSErr ServerOptions (TPrefRec *prefs, DialogPtr dlg, short item)
{
switch (item) {
case kInit:
DlgSetCheck(dlg, kBatchedGroupCmds, prefs->batchedGroupCmds);
DlgSetCheck(dlg, kUseXPAT, prefs->useXPAT);
DlgSetCheck(dlg, kNoNewConnection, prefs->noNewConnection);
DlgSetCheck(dlg, kNoModeReader, prefs->noModeReader);
break;
case kTerm:
prefs->batchedGroupCmds = DlgGetCheck(dlg, kBatchedGroupCmds);
prefs->useXPAT = DlgGetCheck(dlg, kUseXPAT);
prefs->noNewConnection = DlgGetCheck(dlg, kNoNewConnection);
prefs->noModeReader = DlgGetCheck(dlg, kNoModeReader);
break;
case kBatchedGroupCmds:
case kUseXPAT:
case kNoNewConnection:
case kNoModeReader:
DlgToggleCheck(dlg, item);
break;
}
return noErr;
}
/*----------------------------------------------------------------------------
Personal
Handles the personal info preferences dialog.
Entry: prefs = pointer to new prefs.
dlg = pointer to dialog.
item = item number hit.
Exit: function result = error code.
----------------------------------------------------------------------------*/
static OSErr Personal (TPrefRec *prefs, DialogPtr dlg, short item)
{
switch (item) {
case kInit:
DlgSetCString(dlg, kFullName, prefs->fullName);
SetItemMaxLength(dlg, kFullName, 255);
DlgSetCString(dlg, kOrganization, prefs->organization);
SetItemMaxLength(dlg, kOrganization, 255);
DlgSetCString(dlg, kMailAddress, prefs->emailAddress);
SetItemUSAsciiNoBlank(dlg, kMailAddress);
SetItemMaxLength(dlg, kMailAddress, 255);
if (*prefs->fullName == 0) {
SelectDialogItemText(dlg, kFullName, 0, 0);
} else if (*prefs->organization == 0) {
SelectDialogItemText(dlg, kOrganization, 0, 0);
} else if (*prefs->emailAddress == 0) {
SelectDialogItemText(dlg, kMailAddress, 0, 0);
} else {
SelectDialogItemText(dlg, kFullName, 0, kMaxShort);
}
break;
case kTerm:
if (gItem != cancel && !StringIsValidEmailAddress(prefs->emailAddress)) {
StopAlertNumber(kStrBadEmailAddress);
gValid = false;
return noErr;
}
DlgGetCString(dlg, kFullName, prefs->fullName);
DlgGetCString(dlg, kOrganization, prefs->organization);
break;
case kMailAddress:
DlgGetCString(dlg, kMailAddress, prefs->emailAddress);
DlgEnableItem(dlg, ok, *prefs->emailAddress != 0);
DlgEnableItem(dlg, kTopicPopup, *prefs->emailAddress != 0);
}
return noErr;
}
/*----------------------------------------------------------------------------
Signature
Handles the signature preferences dialog.
Entry: prefs = pointer to new prefs.
dlg = pointer to dialog.
item = item number hit.
Exit: function result = error code.
----------------------------------------------------------------------------*/
static OSErr Signature (TPrefRec *prefs, DialogPtr dlg, short item)
{
short len;
switch (item) {
case kInit:
DlgSetCheck(dlg, kAddSigBlankLine, prefs->addSigBlankLine);
DlgSetCheck(dlg, kAddSigSeparator, prefs->addSigSeparatorLine);
SetItemScrollingTextField(dlg, kSignatureEditText,
prefs->textFont, prefs->textSize, false);
DlgSetScrollingText(dlg, kSignatureEditText, prefs->signature,
strlen(prefs->signature));
DlgSetScrollingTextSelection(dlg, kSignatureEditText, 0, 0);
SetItemMaxLength(dlg, kSignatureEditText, 4095);
break;
case kTerm:
prefs->addSigBlankLine = DlgGetCheck(dlg, kAddSigBlankLine);
prefs->addSigSeparatorLine = DlgGetCheck(dlg, kAddSigSeparator);
DlgGetScrollingText(dlg, kSignatureEditText, prefs->signature, &len);
prefs->signature[len] = 0;
break;
case kAddSigBlankLine:
case kAddSigSeparator:
DlgToggleCheck(dlg, item);
break;
}
return noErr;
}
/*----------------------------------------------------------------------------
MessageOptions
Handles the message options preferences dialog.
Entry: prefs = pointer to new prefs.
dlg = pointer to dialog.
item = item number hit.
Exit: function result = error code.
----------------------------------------------------------------------------*/
static OSErr MessageOptions (TPrefRec *prefs, DialogPtr dlg, short item)
{
switch (item) {
case kInit:
DlgSetCheck(dlg, kMsgReplyPost, prefs->replyPost);
DlgSetCheck(dlg, kMsgReplyEmail, prefs->replyEmail);
DlgSetCheck(dlg, kMsgCopySelf, prefs->copySelf);
DlgSetCheck(dlg, kMsgShowMsgDetails, prefs->showMsgDetails);
DlgSetCheck(dlg, kMsgWrapOnSend, prefs->wrapOnSend);
DlgSetCheck(dlg, kMsgShowLabels, prefs->showLabelsUnderIcons);
DlgSetCheck(dlg, kMsgTabEnabled, prefs->tabEnabled);
DlgSetNumber(dlg, kMsgTabStops, prefs->tabStops);
SetItemNumeric(dlg, kMsgTabStops);
SetItemMaxLength(dlg, kMsgTabStops, 2);
SelectDialogItemText(dlg, kMsgTabStops, 0, kMaxShort);
DlgSetCString(dlg, kMsgQuoteString, prefs->quoteString);
SetItemMaxLength(dlg, kMsgQuoteString, 10);
break;
case kTerm:
prefs->replyPost = DlgGetCheck(dlg, kMsgReplyPost);
prefs->replyEmail = DlgGetCheck(dlg, kMsgReplyEmail);
prefs->copySelf = DlgGetCheck(dlg, kMsgCopySelf);
prefs->showMsgDetails = DlgGetCheck(dlg, kMsgShowMsgDetails);
prefs->wrapOnSend = DlgGetCheck(dlg, kMsgWrapOnSend);
prefs->showLabelsUnderIcons = DlgGetCheck(dlg, kMsgShowLabels);
prefs->tabEnabled = DlgGetCheck(dlg, kMsgTabEnabled);
prefs->tabStops = DlgGetNumber(dlg, kMsgTabStops);
DlgGetCString(dlg, kMsgQuoteString, prefs->quoteString);
break;
case kMsgReplyPost:
case kMsgReplyEmail:
case kMsgCopySelf:
case kMsgShowMsgDetails:
case kMsgWrapOnSend:
case kMsgShowLabels:
case kMsgTabEnabled:
DlgToggleCheck(dlg, item);
break;
}
return noErr;
}
/*----------------------------------------------------------------------------
ExtraHeaderLines
Handles the extra header lines preferences dialog.
Entry: prefs = pointer to new prefs.
dlg = pointer to dialog.
item = item number hit.
Exit: function result = error code.
----------------------------------------------------------------------------*/
static OSErr ExtraHeaderLines (TPrefRec *prefs, DialogPtr dlg, short item)
{
short len;
switch (item) {
case kInit:
SetItemScrollingTextField(dlg, kMsgExtraNewsHdrLines,
prefs->textFont, prefs->textSize, false);
DlgSetScrollingText(dlg, kMsgExtraNewsHdrLines, prefs->extraNewsHdrLines,
strlen(prefs->extraNewsHdrLines));
SetItemMaxLength(dlg, kMsgExtraNewsHdrLines, 255);
SetItemScrollingTextField(dlg, kMsgExtraMailHdrLines,
prefs->textFont, prefs->textSize, false);
DlgSetScrollingText(dlg, kMsgExtraMailHdrLines, prefs->extraMailHdrLines,
strlen(prefs->extraMailHdrLines));
SetItemMaxLength(dlg, kMsgExtraMailHdrLines, 255);
DlgSetScrollingTextSelection(dlg, kMsgExtraNewsHdrLines, 0, 0);
break;
case kTerm:
DlgGetScrollingText(dlg, kMsgExtraNewsHdrLines, prefs->extraNewsHdrLines, &len);
prefs->extraNewsHdrLines[len] = 0;
DlgGetScrollingText(dlg, kMsgExtraMailHdrLines, prefs->extraMailHdrLines, &len);
prefs->extraMailHdrLines[len] = 0;
break;
}
return noErr;
}
/*----------------------------------------------------------------------------
Remote
Handles the remote host info preferences dialog.
Entry: prefs = pointer to new prefs.
dlg = pointer to dialog.
item = item number hit.
Exit: function result = error code.
----------------------------------------------------------------------------*/
static OSErr Remote (TPrefRec *prefs, DialogPtr dlg, short item)
{
CStr255 tempStr;
short len;
switch (item) {
case kInit:
DlgSetCString(dlg, kRemoteHostAddr, prefs->ftpNewsrcHost);
SetItemHostAddress(dlg, kRemoteHostAddr);
SetItemMaxLength(dlg, kRemoteHostAddr, 255);
DlgSetCString(dlg, kRemoteLogin, prefs->ftpNewsrcUsername);
SetItemUSAsciiNoBlank(dlg, kRemoteLogin);
SetItemMaxLength(dlg, kRemoteLogin, 255);
len = strlen(prefs->ftpNewsrcPassword);
memset(tempStr, '•', len);
tempStr[len] = 0;
DlgSetCString(dlg, kRemotePassword, tempStr);
SetItemPassword(dlg, kRemotePassword, prefs->ftpNewsrcPassword);
SetItemMaxLength(dlg, kRemotePassword, 31);
DlgSetCString(dlg, kRemotePath, prefs->ftpNewsrcPath);
SetItemMaxLength(dlg, kRemotePath, 31);
DlgSetCheck(dlg, kAutoGetPut, prefs->autoFetchNewsrc);
DlgSetCheck(dlg, kSavePassword, prefs->saveFtpNewsrcPassword);
if (*prefs->ftpNewsrcHost == 0) {
SelectDialogItemText(dlg, kRemoteHostAddr, 0, 0);
} else if (*prefs->ftpNewsrcUsername == 0) {
SelectDialogItemText(dlg, kRemoteLogin, 0, 0);
} else if (*prefs->ftpNewsrcPassword == 0) {
SelectDialogItemText(dlg, kRemotePassword, 0, 0);
} else if (*prefs->ftpNewsrcPath == 0) {
SelectDialogItemText(dlg, kRemotePath, 0, 0);
} else {
SelectDialogItemText(dlg, kRemoteHostAddr, 0, kMaxShort);
}
break;
case kTerm:
DlgGetCString(dlg, kRemoteHostAddr, prefs->ftpNewsrcHost);
DlgGetCString(dlg, kRemoteLogin, prefs->ftpNewsrcUsername);
DlgGetCString(dlg, kRemotePath, prefs->ftpNewsrcPath);
prefs->autoFetchNewsrc = DlgGetCheck(dlg, kAutoGetPut);
prefs->saveFtpNewsrcPassword = DlgGetCheck(dlg, kSavePassword);
break;
case kSavePassword:
case kAutoGetPut:
DlgToggleCheck(dlg, item);
break;
}
return noErr;
}
/*----------------------------------------------------------------------------
DrawFontSample
A user item procedure to draw the font samples.
Entry: dlg = pointer to dialog.
item = item number.
----------------------------------------------------------------------------*/
static pascal void DrawFontSample (DialogPtr dlg, short item)
{
short itemType;
Rect box;
Handle itemHandle;
Str255 text;
short fontID, fontSize;
TextStyle savedStyle;
DlgGrayBorderItem(dlg, item);
GetDialogItem(dlg, item, &itemType, &itemHandle, &box);
if (gScreenFontsTopic) {
if (item == kListSample) {
GetPString(kStrGroupSubjectSample, text);
fontID = gListFontID;
fontSize = gListFontSize;
} else {
GetPString(kStrArtMsgSample, text);
fontID = gTextFontID;
fontSize = gTextFontSize;
}
} else {
GetPString(kStrPrintingSample, text);
fontID = gPrintingFontID;
fontSize = gPrintingFontSize;
}
GetPortTextStyle(&savedStyle);
TextFont(fontID);
TextSize(fontSize);
InsetRect(&box, 2, 2);
TETextBox(text + 1, *text, &box, teFlushDefault);
SetPortTextStyle(&savedStyle);
}
/*----------------------------------------------------------------------------
RedrawSample
Force one of the sample text items to be redrawn.
Entry: dlg = pointer to dialog.
item = item number.
----------------------------------------------------------------------------*/
static void RedrawSample (DialogPtr dlg, short item)
{
short itemType;
Handle itemHandle;
Rect box;
GetDialogItem(dlg, item, &itemType, &itemHandle, &box);
InsetRect(&box, 2, 2);
EraseRect(&box);
InvalRect(&box);
}
/*----------------------------------------------------------------------------
SetNewFont
Set a new font in the font/size dialog.
Entry: dlg = pointer to dialog.
listFont = true if list font, false if text font.
fontNum = new font number.
----------------------------------------------------------------------------*/
static void SetNewFont (DialogPtr dlg, Boolean listFont, short fontNum)
{
short numItems, i;
Str255 itemStr, fontName;
ControlHandle ctl;
long size;
/* Select the right font in the font popup menu. */
ctl = DlgGetControl(dlg,
gScreenFontsTopic ? (listFont ? kListFontPopup : kTextFontPopup) : kPrintingFontPopup);
GetFontName(fontNum, fontName);
SetPopupValue(ctl, fontName, false);
/* Adjust the size popup so the nice sizes are outlined. */
ctl = DlgGetControl(dlg,
gScreenFontsTopic ? (listFont ? kListSizePopup : kTextSizePopup) : kPrintingSizePopup);
numItems = GetControlMaximum(ctl);
for (i = 1; i <= numItems; i++) {
GetPopupPString(ctl, i, itemStr);
StringToNum(itemStr, &size);
if (RealFont(fontNum, (short)size)) {
SetPopupItemStyle(ctl, i, outline);
} else {
SetPopupItemStyle(ctl, i, 0);
}
}
/* Force the sample text to be redrawn */
RedrawSample(dlg,
gScreenFontsTopic ? (listFont ? kListSample : kTextSample) : kPrintingSample);
}
/*----------------------------------------------------------------------------
FontIDFromPopup
Get the font ID corresponding the currently selected font in a popup menu.
Entry: dlg = pointer to dialog.
item = item number of popup menu.
----------------------------------------------------------------------------*/
static short FontIDFromPopup (DialogPtr dlg, short item)
{
ControlHandle ctl;
short fontNum;
Str255 fontName;
ctl = DlgGetControl(dlg, item);
GetPopupPString(ctl, kCurrentPopupItem, fontName);
GetFontNumber(fontName, &fontNum);
return fontNum;
}
/*----------------------------------------------------------------------------
ScreenFonts
Handles the screen fonts preferences dialog.
Entry: prefs = pointer to new prefs.
dlg = pointer to dialog.
item = item number hit.
Exit: function result = error code.
----------------------------------------------------------------------------*/
static OSErr ScreenFonts (TPrefRec *prefs, DialogPtr dlg, short item)
{
Str255 tempStr;
long num;
switch (item) {
case kInit:
gScreenFontsTopic = true;
GetFontNumber(prefs->listFont, &gListFontID);
gListFontSize = prefs->listSize;
SetNewFont(dlg, true, gListFontID);
DlgSetNumber(dlg, kListSizeBox, gListFontSize);
SetItemNumeric(dlg, kListSizeBox);
SetItemMaxLength(dlg, kListSizeBox, 2);
SelectDialogItemText(dlg, kListSizeBox, 0, kMaxShort);
SetItemPopupTypeinItem(dlg, kListSizePopup, kListSizeBox);
GetFontNumber(prefs->textFont, &gTextFontID);
gTextFontSize = prefs->textSize;
SetNewFont(dlg, false, gTextFontID);
DlgSetNumber(dlg, kTextSizeBox, gTextFontSize);
SetItemNumeric(dlg, kTextSizeBox);
SetItemMaxLength(dlg, kTextSizeBox, 2);
SetItemPopupTypeinItem(dlg, kTextSizePopup, kTextSizeBox);
DlgSetUserItem(dlg, kListSample, gDrawFontSampleUPP);
DlgSetUserItem(dlg, kTextSample, gDrawFontSampleUPP);
DlgSetUserItem(dlg, kListVertLine, gDlgGrayBorderItemUPP);
break;
case kTerm:
GetFontName(gListFontID, prefs->listFont);
GetFontName(gTextFontID, prefs->textFont);
prefs->listSize = gListFontSize;
prefs->textSize = gTextFontSize;
break;
case kListFontPopup:
gListFontID = FontIDFromPopup(dlg, item);
SetNewFont(dlg, true, gListFontID);
break;
case kTextFontPopup:
gTextFontID = FontIDFromPopup(dlg, item);
SetNewFont(dlg, false, gTextFontID);
break;
case kListSizePopup:
case kListSizeBox:
DlgGetPString(dlg, kListSizeBox, tempStr);
StringToNum(tempStr, &num);
if (num != 0 && num != gListFontSize) {
gListFontSize = num;
RedrawSample(dlg, kListSample);
}
break;
case kTextSizePopup:
case kTextSizeBox:
DlgGetPString(dlg, kTextSizeBox, tempStr);
StringToNum(tempStr, &num);
if (num != 0 && num != gTextFontSize) {
gTextFontSize = num;
RedrawSample(dlg, kTextSample);
}
break;
}
return noErr;
}
/*----------------------------------------------------------------------------
PrintingFont
Handles the printing font preferences dialog.
Entry: prefs = pointer to new prefs.
dlg = pointer to dialog.
item = item number hit.
Exit: function result = error code.
----------------------------------------------------------------------------*/
static OSErr PrintingFont (TPrefRec *prefs, DialogPtr dlg, short item)
{
Str255 tempStr;
long num;
switch (item) {
case kInit:
gScreenFontsTopic = false;
GetFontNumber(prefs->printingFont, &gPrintingFontID);
gPrintingFontSize = prefs->printingSize;
SetNewFont(dlg, true, gPrintingFontID);
DlgSetNumber(dlg, kPrintingSizeBox, gPrintingFontSize);
SetItemNumeric(dlg, kPrintingSizeBox);
SetItemMaxLength(dlg, kPrintingSizeBox, 2);
SelectDialogItemText(dlg, kPrintingSizeBox, 0, kMaxShort);
SetItemPopupTypeinItem(dlg, kPrintingSizePopup, kPrintingSizeBox);
DlgSetUserItem(dlg, kPrintingSample, gDrawFontSampleUPP);
break;
case kTerm:
GetFontName(gPrintingFontID, prefs->printingFont);
prefs->printingSize = gPrintingFontSize;
break;
case kPrintingFontPopup:
gPrintingFontID = FontIDFromPopup(dlg, item);
SetNewFont(dlg, true, gPrintingFontID);
break;
case kPrintingSizePopup:
case kPrintingSizeBox:
DlgGetPString(dlg, kPrintingSizeBox, tempStr);
StringToNum(tempStr, &num);
if (num != 0 && num != gPrintingFontSize) {
gPrintingFontSize = num;
RedrawSample(dlg, kPrintingSample);
}
break;
}
return noErr;
}
/*----------------------------------------------------------------------------
SavedUGL
Handles the saved user group lists preferences dialog.
Entry: prefs = pointer to new prefs.
dlg = pointer to dialog.
item = item number hit.
Exit: function result = error code.
----------------------------------------------------------------------------*/
static OSErr SavedUGL (TPrefRec *prefs, DialogPtr dlg, short item)
{
StandardFileReply reply;
long dirID;
Str31 name;
OSErr err = noErr;
CInfoPBRec pb;
Boolean valid;
AliasHandle alias;
switch (item) {
case kInit:
DlgSetCheck(dlg, kSavedUGLDirCheckBox, prefs->savedUGLDefaultFolder);
DlgSetUserItem(dlg, kSavedUGLDirBorder, gDlgGrayBorderItemUPP);
ValidateSavedFolderAlias(prefs->savedUGLDefaultFolderAlias,
&pb.dirInfo.ioVRefNum, &pb.dirInfo.ioDrDirID, &valid);
if (valid) {
pb.dirInfo.ioNamePtr = name;
pb.dirInfo.ioFDirIndex = -1;
PBGetCatInfo(&pb, false);
} else {
*name = 0;
}
DlgSetPString(dlg, kSavedUGLDirName, name);
DlgEnableItem(dlg, kSavedUGLDirButton, prefs->savedUGLDefaultFolder);
DlgSetCheck(dlg, kSavedUGLAutoSaveOnQuit, prefs->autoSaveOnQuit);
break;
case kTerm:
prefs->autoSaveOnQuit = DlgGetCheck(dlg, kSavedUGLAutoSaveOnQuit);
break;
case kSavedUGLDirCheckBox:
DlgToggleCheck(dlg, item);
prefs->savedUGLDefaultFolder = DlgGetCheck(dlg, item);
DlgEnableItem(dlg, kSavedUGLDirButton, prefs->savedUGLDefaultFolder);
break;
case kSavedUGLDirButton:
MyStandardGetDirectory(&reply, &dirID);
if (!reply.sfGood) break;
err = NewAlias(nil, &reply.sfFile, &alias);
if (err == noErr) {
MyDisposeHandle(prefs->savedUGLDefaultFolderAlias);
prefs->savedUGLDefaultFolderAlias = alias;
}
DlgSetPString(dlg, kSavedUGLDirName, reply.sfFile.name);
break;
case kSavedUGLAutoSaveOnQuit:
DlgToggleCheck(dlg, item);
break;
}
return noErr;
}
/*----------------------------------------------------------------------------
InvisibleFilesFilter
A standard file dialog filter to filter out invisible files.
Entry: pb = pointer to file info param block.
myDataPtr = pointer to private data (not used).
Exit: function result = true if file is invisible.
----------------------------------------------------------------------------*/
static pascal Boolean InvisibleFilesFilter (CInfoPBPtr pb, void *myDataPtr)
{
return (pb->hFileInfo.ioFlFndrInfo.fdFlags & fInvisible) != 0;
}
/*----------------------------------------------------------------------------
SavedArt
Handles the saved articles preferences dialog.
Entry: prefs = pointer to new prefs.
dlg = pointer to dialog.
item = item number hit.
Exit: function result = error code.
----------------------------------------------------------------------------*/
static OSErr SavedArt (TPrefRec *prefs, DialogPtr dlg, short item)
{
StandardFileReply reply;
FInfo fInfo;
long dirID;
Str31 name;
OSErr err = noErr;
CInfoPBRec pb;
Boolean valid;
AliasHandle alias;
switch (item) {
case kInit:
DlgSetUserItem(dlg, kSavedArtAppBorder, gDlgGrayBorderItemUPP);
err = FindAppNameFromSig(prefs->savedArtCreator, name);
if (err == noErr) {
DlgSetPString(dlg, kSavedArtAppName, name);
CopyPascalString(prefs->savedArtAppName, name);
} else {
DlgSetPString(dlg, kSavedArtAppName, prefs->savedArtAppName);
}
DlgSetCheck(dlg, kSavedArtDirCheckBox, prefs->savedArtDefaultFolder);
DlgSetUserItem(dlg, kSavedArtDirBorder, gDlgGrayBorderItemUPP);
ValidateSavedFolderAlias(prefs->savedArtDefaultFolderAlias,
&pb.dirInfo.ioVRefNum, &pb.dirInfo.ioDrDirID, &valid);
if (valid) {
pb.dirInfo.ioNamePtr = name;
pb.dirInfo.ioFDirIndex = -1;
PBGetCatInfo(&pb, false);
} else {
*name = 0;
}
DlgSetPString(dlg, kSavedArtDirName, name);
DlgEnableItem(dlg, kSavedArtDirButton, prefs->savedArtDefaultFolder);
DlgSetCheck(dlg, kSavedArtSepFiles, prefs->saveThreadsToSeparateFiles);
DlgSetCheck(dlg, kSavedArtAutoAppend, prefs->appendIfFileAlreadyExists);
DlgSetCheck(dlg, kSavedArtSaveEncoded, prefs->saveEncodedText);
break;
case kTerm:
prefs->saveThreadsToSeparateFiles = DlgGetCheck(dlg, kSavedArtSepFiles);
prefs->appendIfFileAlreadyExists = DlgGetCheck(dlg, kSavedArtAutoAppend);
prefs->saveEncodedText = DlgGetCheck(dlg, kSavedArtSaveEncoded);
break;
case kSavedArtAppButton:
MyStandardGetFile(gInvisibleFilesFilterUPP, 2, "APPLadrp", &reply, nil);
if (!reply.sfGood) break;
FSpGetFInfo(&reply.sfFile, &fInfo);
prefs->savedArtCreator = fInfo.fdCreator;
CopyPascalString(prefs->savedArtAppName, reply.sfFile.name);
DlgSetPString(dlg, kSavedArtAppName, prefs->savedArtAppName);
break;
case kSavedArtDirCheckBox:
DlgToggleCheck(dlg, item);
prefs->savedArtDefaultFolder = DlgGetCheck(dlg, item);
DlgEnableItem(dlg, kSavedArtDirButton, prefs->savedArtDefaultFolder);
break;
case kSavedArtDirButton:
MyStandardGetDirectory(&reply, &dirID);
if (!reply.sfGood) break;
err = NewAlias(nil, &reply.sfFile, &alias);
if (err == noErr) {
MyDisposeHandle(prefs->savedArtDefaultFolderAlias);
prefs->savedArtDefaultFolderAlias = alias;
}
DlgSetPString(dlg, kSavedArtDirName, reply.sfFile.name);
break;
case kSavedArtSepFiles:
case kSavedArtAutoAppend:
case kSavedArtSaveEncoded:
DlgToggleCheck(dlg, item);
break;
}
return noErr;
}
/*----------------------------------------------------------------------------
SavedMsg
Handles the saved messages preferences dialog.
Entry: prefs = pointer to new prefs.
dlg = pointer to dialog.
item = item number hit.
Exit: function result = error code.
----------------------------------------------------------------------------*/
static OSErr SavedMsg (TPrefRec *prefs, DialogPtr dlg, short item)
{
StandardFileReply reply;
long dirID;
Str31 name;
OSErr err = noErr;
CInfoPBRec pb;
Boolean valid;
AliasHandle alias;
switch (item) {
case kInit:
DlgSetCheck(dlg, kSavedMsgDirCheckBox, prefs->savedMsgDefaultFolder);
DlgSetUserItem(dlg, kSavedMsgDirBorder, gDlgGrayBorderItemUPP);
ValidateSavedFolderAlias(prefs->savedMsgDefaultFolderAlias,
&pb.dirInfo.ioVRefNum, &pb.dirInfo.ioDrDirID, &valid);
if (valid) {
pb.dirInfo.ioNamePtr = name;
pb.dirInfo.ioFDirIndex = -1;
PBGetCatInfo(&pb, false);
} else {
*name = 0;
}
DlgSetPString(dlg, kSavedMsgDirName, name);
DlgEnableItem(dlg, kSavedMsgDirButton, prefs->savedMsgDefaultFolder);
DlgSetCheck(dlg, kSavedMsgDelAfterSend, prefs->savedMsgDelAfterSend);
break;
case kTerm:
break;
case kSavedMsgDirCheckBox:
DlgToggleCheck(dlg, item);
prefs->savedMsgDefaultFolder = DlgGetCheck(dlg, item);
DlgEnableItem(dlg, kSavedMsgDirButton, prefs->savedMsgDefaultFolder);
break;
case kSavedMsgDirButton:
MyStandardGetDirectory(&reply, &dirID);
if (!reply.sfGood) break;
err = NewAlias(nil, &reply.sfFile, &alias);
if (err == noErr) {
MyDisposeHandle(prefs->savedMsgDefaultFolderAlias);
prefs->savedMsgDefaultFolderAlias = alias;
}
DlgSetPString(dlg, kSavedMsgDirName, reply.sfFile.name);
break;
case kSavedMsgDelAfterSend:
DlgToggleCheck(dlg, item);
prefs->savedMsgDelAfterSend = DlgGetCheck(dlg, item);
break;
}
return noErr;
}
/*----------------------------------------------------------------------------
DrawURLItem
Draw a URL helper list item.
Entry: theList = URL helper list ref = gURLList.
offset = offset of C-format string to draw in gURLListStrings.
*itemRect = item rectangle.
----------------------------------------------------------------------------*/
static void DrawURLItem (BigListRef theList, long offset, Rect *itemRect)
{
Str255 str;
FontInfo fontInfo;
strcpy((char*)str, *gURLListStrings+offset);
c2pstr((char*)str);
TruncString(itemRect->right - itemRect->left, str, smTruncEnd);
GetFontInfo(&fontInfo);
MoveTo(itemRect->left, itemRect->top + fontInfo.ascent);
DrawString(str);
}
/*----------------------------------------------------------------------------
DrawURLList
A user item procedure to draw the URL helper list.
Entry: dlg = pointer to dialog.
item = item number.
----------------------------------------------------------------------------*/
static pascal void DrawURLList (DialogPtr dlg, short item)
{
short itemType;
Rect box;
Handle itemHandle;
GetDialogItem(dlg, item, &itemType, &itemHandle, &box);
FrameRect(&box);
BigLGetViewRect(gURLList, &box);
box.right -= 15;
EraseRect(&box);
BigLUpdate(gURLList);
}
/*----------------------------------------------------------------------------
SetURLListItemString
Set the string displayed for an item in the URL helper list.
Entry: prefs = pointer to new prefs.
listItem = item number.
Exit: function result = error code.
----------------------------------------------------------------------------*/
static OSErr SetURLListItemString (TPrefRec *prefs, long listItem)
{
TURLHelperInfo helperInfo;
char appName[32];
CStr255 str;
long len, offset;
OSErr err = noErr;
helperInfo = (*prefs->urlHelpers)[listItem];
*appName = 0;
if (helperInfo.sig != 0) FindAppNameFromSig(helperInfo.sig, (StringPtr)appName);
p2cstr((StringPtr)appName);
sprintf(str, "%s — %s", helperInfo.schemeName, appName);
len = strlen(str) + 1;
offset = MyGetHandleSize(gURLListStrings);
err = MySetHandleSize(gURLListStrings, offset+len);
if (err != noErr) return err;
BlockMoveData(str, *gURLListStrings+offset, len);
BigLSetData(gURLList, listItem, offset);
return noErr;
}
/*----------------------------------------------------------------------------
SetNewURLHelper
Set a new URL helper.
Entry: prefs = pointer to new prefs.
Exit: function result = error code.
----------------------------------------------------------------------------*/
static OSErr SetNewURLHelper (TPrefRec *prefs)
{
TURLHelperInfo *p;
long listItem;
StandardFileReply reply;
OSErr err = noErr;
listItem = BigLGetFirstSelectedItem(gURLList);
if (listItem < 0) return noErr;
MyStandardGetFile(gInvisibleFilesFilterUPP, 2, "APPLadrp", &reply, nil);
if (!reply.sfGood) return noErr;
if (!ValidHelper(&reply.sfFile)) return noErr;
MyHLock(prefs->urlHelpers);
p = &(*prefs->urlHelpers)[listItem];
if (ValidURLHelper(&reply.sfFile, p)) {
err = SetURLListItemString(prefs, listItem);
}
MyHUnlock(prefs->urlHelpers);
return err;
}
/*----------------------------------------------------------------------------
AdjustURLButtons
Adjust (enable/disable) the Change, Delete, and Add buttons in the URL
helper programs topic.
Entry: dlg = pointer to dialog.
----------------------------------------------------------------------------*/
static void AdjustURLButtons (DialogPtr dlg)
{
Boolean itemSelected;
TURLSchemeName schemeName;
itemSelected = BigLListHasSelectedItem(gURLList);
DlgEnableItem(dlg, kURLChangeButton, itemSelected);
DlgEnableItem(dlg, kURLDeleteButton, itemSelected);
DlgGetCString(dlg, kURLNewScheme, schemeName);
DlgEnableItem(dlg, kURLAddButton, *schemeName != 0);
}
/*----------------------------------------------------------------------------
CompareURLHelperInfo
Compare two URL helper program info records.
Entry: a = pointer to first helper program info record.
b = pointer to second helper program info record.
Exit: function result =
-1 if a->schemeName < b->schemName
0 if a->schemeName = b->schemName
+1 if a->schemeName > b->schemName
----------------------------------------------------------------------------*/
static OSErr CompareURLHelperInfo (TURLHelperInfo *a, TURLHelperInfo *b, short *result)
{
*result = MyStrCmp(a->schemeName, b->schemeName);
return noErr;
}
/*----------------------------------------------------------------------------
URLScrollIntoView
Scroll the selected item into view in the URL topic.
----------------------------------------------------------------------------*/
static void URLScrollIntoView (void)
{
long listItem;
listItem = BigLGetFirstSelectedItem(gURLList);
if (listItem < 0) return;
BigLScrollItemIntoView(gURLList, listItem, kBigLScrollToTop, kBigLScrollToBottom);
}
/*----------------------------------------------------------------------------
URLHelpersFilter
Filter proc for the URL Helper Programs topic.
Entry: dlg = pointer to dialog.
ev = pointer to event record.
Exit: function result = true if event handled and item hit.
*itemHit = item number of item hit.
ev = pointer to possibly modified event record.
This dialog filter handles arrow keys and paging keys.
----------------------------------------------------------------------------*/
static pascal Boolean URLHelpersFilter (DialogPtr dlg, EventRecord *ev,
short *itemHit)
{
if (ev->what == keyDown || ev->what == autoKey) {
if (BigLKey(gURLList, ev->message & charCodeMask, 0)) {
AdjustURLButtons(dlg);
ev->what = nullEvent;
return false;
}
}
return DialogFilter(dlg, ev, itemHit);
}
/*----------------------------------------------------------------------------
URLHelpers
Handles the URL helper programs preferences dialog.
Entry: prefs = pointer to new prefs.
dlg = pointer to dialog.
item = item number hit.
Exit: function result = error code.
----------------------------------------------------------------------------*/
static OSErr URLHelpers (TPrefRec *prefs, DialogPtr dlg, short item)
{
short itemType;
Rect box;
Handle itemHandle;
Point where;
TURLHelperInfo *p;
long numHelpers, listItem;
CStr255 fmt, msg;
long len;
TURLSchemeName schemeName;
char *c;
short cmp;
TURLHelperInfo newHelper;
OSErr err = noErr;
StandardFileReply reply;
Boolean doubleClick, savedHiliteState;
switch (item) {
case kInit:
gURLList = nil;
gURLListStrings = nil;
GetDialogItem(dlg, kURLList, &itemType, &itemHandle, &box);
FrameRect(&box);
InsetRect(&box, 1, 1);
numHelpers = 0;
for (p = *prefs->urlHelpers; *p->schemeName != 0; p++) numHelpers++;
savedHiliteState = ((WindowPeek)dlg)->hilited;
((WindowPeek)dlg)->hilited = true;
err = BigLNew(&box, dlg, 0, true, DrawURLItem, &gURLList);
((WindowPeek)dlg)->hilited = savedHiliteState;
if (err != noErr) goto exit;
err = MyNewHandle(0, &gURLListStrings);
if (err != noErr) goto exit;
MyHLock(prefs->urlHelpers);
FastQSort(*prefs->urlHelpers, numHelpers, sizeof(TURLHelperInfo),
(SortCmpFunction)CompareURLHelperInfo);
MyHUnlock(prefs->urlHelpers);
for (listItem = 0; listItem < numHelpers; listItem++) {
err = BigLAddItems(gURLList, listItem, 1);
if (err != noErr) goto exit;
err = SetURLListItemString(prefs, listItem);
if (err != noErr) goto exit;
}
DlgSetUserItem(dlg, kURLList, gDrawURLListUPP);
SetItemURLSchemeName(dlg, kURLNewScheme);
SetItemMaxLength(dlg, kURLNewScheme, kMaxSchemeNameLen);
DlgSetCheck(dlg, kURLUseWebHelper, prefs->useWebHelperForHtmlFiles);
AdjustURLButtons(dlg);
break;
case kTerm:
prefs->useWebHelperForHtmlFiles = DlgGetCheck(dlg, kURLUseWebHelper);
if (gURLList != nil) BigLDispose(gURLList);
MyDisposeHandle(gURLListStrings);
break;
case kURLList:
where = gCurEvent.where;
GlobalToLocal(&where);
BigLClick(gURLList, where, 0, &doubleClick);
if (doubleClick) {
err = SetNewURLHelper(prefs);
if (err != noErr) goto exit;
}
AdjustURLButtons(dlg);
break;
case kURLChangeButton:
err = SetNewURLHelper(prefs);
if (err != noErr) goto exit;
break;
case kURLDeleteButton:
listItem = BigLGetFirstSelectedItem(gURLList);
if (listItem < 0) break;
len = MyGetHandleSize(prefs->urlHelpers);
BlockMoveData(
*prefs->urlHelpers + listItem + 1,
*prefs->urlHelpers + listItem,
len - (listItem+1) * sizeof(TURLHelperInfo));
MySetHandleSize(prefs->urlHelpers, len - sizeof(TURLHelperInfo));
BigLDeleteItems(gURLList, listItem, 1);
if (listItem >= BigLGetNumItems(gURLList)) listItem--;
if (listItem >= 0) {
BigLSelectOnlyOne(gURLList, listItem);
URLScrollIntoView();
}
AdjustURLButtons(dlg);
break;
case kURLNewScheme:
AdjustURLButtons(dlg);
break;
case kURLAddButton:
DlgGetCString(dlg, kURLNewScheme, schemeName);
if (*schemeName == 0) break;
for (c = schemeName; *c != 0; c++) *c = tolower(*c);
if (MyStrCmp(schemeName, "nntp") == 0 || MyStrCmp(schemeName, "news") == 0 ||
MyStrCmp(schemeName, "mailto") == 0)
{
StopAlertNumber(kStrCantRedefineBuiltinURLs);
return noErr;
}
for (listItem = 0, p = *prefs->urlHelpers; *p->schemeName != 0; listItem++, p++) {
cmp = MyStrCmp(schemeName, p->schemeName);
if (cmp < 0) break;
if (cmp == 0) {
BigLSelectOnlyOne(gURLList, listItem);
URLScrollIntoView();
GetCString(kStrURLSchemeAlreadyDefined, fmt);
sprintf(msg, fmt, schemeName);
StopAlertMessage(msg);
return noErr;
}
}
MyStandardGetFile(gInvisibleFilesFilterUPP, 2, "APPLadrp", &reply, nil);
if (!reply.sfGood) return noErr;
if (!ValidHelper(&reply.sfFile)) return noErr;
if (ValidURLHelper(&reply.sfFile, &newHelper)) {
len = MyGetHandleSize(prefs->urlHelpers);
err = MySetHandleSize(prefs->urlHelpers, len + sizeof(TURLHelperInfo));
if (err != noErr) goto exit;
BlockMoveData(
*prefs->urlHelpers + listItem,
*prefs->urlHelpers + listItem + 1,
len - listItem * sizeof(TURLHelperInfo));
strcpy(newHelper.schemeName, schemeName);
(*prefs->urlHelpers)[listItem] = newHelper;
err = BigLAddItems(gURLList, listItem, 1);
if (err != noErr) goto exit;
err = SetURLListItemString(prefs, listItem);
if (err != noErr) goto exit;
BigLSelectOnlyOne(gURLList, listItem);
URLScrollIntoView();
DlgSetCString(dlg, kURLNewScheme, "");
AdjustURLButtons(dlg);
}
break;
case kURLUseWebHelper:
DlgToggleCheck(dlg, item);
break;
}
return noErr;
exit:
if (gURLList != nil) BigLDispose(gURLList);
MyDisposeHandle(gURLListStrings);
return err;
}
/*----------------------------------------------------------------------------
Auth
Handles the authorization preferences dialog.
Entry: prefs = pointer to new prefs.
dlg = pointer to dialog.
item = item number hit.
Exit: function result = error code.
----------------------------------------------------------------------------*/
static OSErr Auth (TPrefRec *prefs, DialogPtr dlg, short item)
{
CStr255 tempStr;
short len;
switch (item) {
case kInit:
DlgSetCString(dlg, kAuthUsername, prefs->authUsername);
SetItemUSAsciiNoBlank(dlg, kAuthUsername);
SetItemMaxLength(dlg, kAuthUsername, 31);
len = strlen(prefs->authPassword);
memset(tempStr, '•', len);
tempStr[len] = 0;
DlgSetCString(dlg, kAuthPassword, tempStr);
SetItemPassword(dlg, kAuthPassword, prefs->authPassword);
SetItemMaxLength(dlg, kAuthPassword, 31);
DlgSetCheck(dlg, kAuthSavePassword, prefs->authSavePassword);
DlgSetCheck(dlg, kAuthPrivateGroups, prefs->authPrivateGroups);
DlgSetCtlValue(dlg, prefs->authAtStartup ? kAuthAtStartup :
kAuthWhenRequested, 1);
if (*prefs->authUsername == 0) {
SelectDialogItemText(dlg, kAuthUsername, 0, 0);
} else if (*prefs->authPassword == 0) {
SelectDialogItemText(dlg, kAuthPassword, 0, 0);
} else {
SelectDialogItemText(dlg, kAuthUsername, 0, kMaxShort);
}
break;
case kTerm:
DlgGetCString(dlg, kAuthUsername, prefs->authUsername);
prefs->authSavePassword = DlgGetCheck(dlg, kAuthSavePassword);
prefs->authPrivateGroups = DlgGetCheck(dlg, kAuthPrivateGroups);
prefs->authAtStartup = DlgGetCtlValue(dlg, kAuthAtStartup) == 1;
break;
case kAuthSavePassword:
case kAuthPrivateGroups:
DlgToggleCheck(dlg, item);
break;
case kAuthAtStartup:
if (DlgGetCtlValue(dlg, kAuthAtStartup) == 0) {
DlgSetCtlValue(dlg, kAuthAtStartup, 1);
DlgSetCtlValue(dlg, kAuthWhenRequested, 0);
}
break;
case kAuthWhenRequested:
if (DlgGetCtlValue(dlg, kAuthWhenRequested) == 0) {
DlgSetCtlValue(dlg, kAuthWhenRequested, 1);
DlgSetCtlValue(dlg, kAuthAtStartup, 0);
}
break;
}
return noErr;
}
/*----------------------------------------------------------------------------
Extract
Handles the extracting binaries preferences dialog.
Entry: prefs = pointer to new prefs.
dlg = pointer to dialog.
item = item number hit.
Exit: function result = error code.
----------------------------------------------------------------------------*/
static OSErr Extract (TPrefRec *prefs, DialogPtr dlg, short item)
{
StandardFileReply reply;
FInfo fInfo;
long dirID;
Str31 name;
OSErr err = noErr;
CInfoPBRec pb;
Boolean valid;
AliasHandle alias;
switch (item) {
case kInit:
DlgSetCheck(dlg, kSavedBinDirCheckBox, prefs->savedBinDefaultFolder);
DlgSetUserItem(dlg, kSavedBinDirBorder, gDlgGrayBorderItemUPP);
ValidateSavedFolderAlias(prefs->savedBinDefaultFolderAlias,
&pb.dirInfo.ioVRefNum, &pb.dirInfo.ioDrDirID, &valid);
if (valid) {
pb.dirInfo.ioNamePtr = name;
pb.dirInfo.ioFDirIndex = -1;
PBGetCatInfo(&pb, false);
} else {
*name = 0;
}
DlgSetPString(dlg, kSavedBinDirName, name);
DlgEnableItem(dlg, kSavedBinDirButton, prefs->savedBinDefaultFolder);
DlgSetUserItem(dlg, kHqxAppBorder, gDlgGrayBorderItemUPP);
err = FindAppNameFromSig(prefs->hqxHelper, name);
if (err == noErr) {
DlgSetPString(dlg, kHqxAppName, name);
CopyPascalString(prefs->hqxHelperName, name);
} else {
DlgSetPString(dlg, kHqxAppName, prefs->hqxHelperName);
}
DlgSetUserItem(dlg, kUUAppBorder, gDlgGrayBorderItemUPP);
err = FindAppNameFromSig(prefs->uuHelper, name);
if (err == noErr) {
DlgSetPString(dlg, kUUAppName, name);
CopyPascalString(prefs->uuHelperName, name);
} else {
DlgSetPString(dlg, kUUAppName, prefs->uuHelperName);
}
break;
case kTerm:
break;
case kSavedBinDirCheckBox:
DlgToggleCheck(dlg, item);
prefs->savedBinDefaultFolder = DlgGetCheck(dlg, item);
DlgEnableItem(dlg, kSavedBinDirButton, prefs->savedBinDefaultFolder);
break;
case kSavedBinDirButton:
MyStandardGetDirectory(&reply, &dirID);
if (!reply.sfGood) break;
err = NewAlias(nil, &reply.sfFile, &alias);
if (err == noErr) {
MyDisposeHandle(prefs->savedBinDefaultFolderAlias);
prefs->savedBinDefaultFolderAlias = alias;
}
DlgSetPString(dlg, kSavedBinDirName, reply.sfFile.name);
break;
case kHqxAppButton:
MyStandardGetFile(gInvisibleFilesFilterUPP, 2, "APPLadrp", &reply, nil);
if (!reply.sfGood) break;
if (!ValidHelper(&reply.sfFile)) break;
FSpGetFInfo(&reply.sfFile, &fInfo);
prefs->hqxHelper = fInfo.fdCreator;
CopyPascalString(prefs->hqxHelperName, reply.sfFile.name);
DlgSetPString(dlg, kHqxAppName, prefs->hqxHelperName);
break;
case kUUAppButton:
MyStandardGetFile(gInvisibleFilesFilterUPP, 2, "APPLadrp", &reply, nil);
if (!reply.sfGood) break;
if (!ValidHelper(&reply.sfFile)) break;
FSpGetFInfo(&reply.sfFile, &fInfo);
prefs->uuHelper = fInfo.fdCreator;
CopyPascalString(prefs->uuHelperName, reply.sfFile.name);
DlgSetPString(dlg, kUUAppName, prefs->uuHelperName);
break;
}
return noErr;
}
/*----------------------------------------------------------------------------
MiscOptions
Handle the miscellaneous options preferences dialog.
Entry: prefs = pointer to new prefs.
dlg = pointer to dialog.
item = item number hit.
Exit: function result = error code.
----------------------------------------------------------------------------*/
static OSErr MiscOptions (TPrefRec *prefs, DialogPtr dlg, short item)
{
switch (item) {
case kInit:
DlgSetCheck(dlg, kReZoomWindows, prefs->reZoomWindows);
DlgSetCheck(dlg, kCheckNewGroups, prefs->checkForNewGroups);
DlgSetCheck(dlg, kAreYouSure, prefs->areYouSureAlert);
DlgSetCheck(dlg, kLogActionsToFile, prefs->logActionsToFile);
DlgSetCheck(dlg, kDontCoverFinderIcons, prefs->dontCoverFinderIcons);
DlgSetCheck(dlg, kUseInternetConfig, prefs->useInternetConfig);
break;
case kTerm:
prefs->reZoomWindows = DlgGetCheck(dlg, kReZoomWindows);
prefs->checkForNewGroups = DlgGetCheck(dlg, kCheckNewGroups);
prefs->areYouSureAlert = DlgGetCheck(dlg, kAreYouSure);
prefs->logActionsToFile = DlgGetCheck(dlg, kLogActionsToFile);
prefs->dontCoverFinderIcons = DlgGetCheck(dlg, kDontCoverFinderIcons);
prefs->useInternetConfig = DlgGetCheck(dlg, kUseInternetConfig);
break;
case kReZoomWindows:
case kCheckNewGroups:
case kAreYouSure:
case kLogActionsToFile:
case kDontCoverFinderIcons:
case kUseInternetConfig:
DlgToggleCheck(dlg, item);
break;
}
return noErr;
}
/*----------------------------------------------------------------------------
DrawGrayOutline
A user item procedure to draw the gray outline.
Entry: dlg = pointer to dialog.
item = item number of gray outline user item.
----------------------------------------------------------------------------*/
static pascal void DrawGrayOutline (DialogPtr dlg, short item)
{
Handle itemHandle;
ControlHandle popupCtl;
short itemType;
Rect box, popupBox, r;
GetDialogItem(dlg, item, &itemType, &itemHandle, &box);
GetDialogItem(dlg, kTopicPopup, &itemType, (Handle*)&popupCtl, &popupBox);
popupBox = (**popupCtl).contrlRect;
r = box;
r.bottom = r.top + 1;
r.right = popupBox.left - 1;
DrawGrayRect(&r);
r = box;
r.bottom = r.top + 1;
r.left = popupBox.right + 5;
DrawGrayRect(&r);
r = box;
r.right = r.left + 1;
DrawGrayRect(&r);
r = box;
r.left = r.right - 1;
DrawGrayRect(&r);
r = box;
r.top = r.bottom - 1;
DrawGrayRect(&r);
}
/*----------------------------------------------------------------------------
DrawArrows
A user item procedure to draw the arrows.
Entry: dlg = pointer to dialog.
item = item number.
----------------------------------------------------------------------------*/
static pascal void DrawArrows (DialogPtr dlg, short item)
{
short itemType;
Handle itemHandle;
Rect box;
GetDialogItem(dlg, kArrows, &itemType, &itemHandle, &box);
FrameRoundRect(&box, 8, 8);
DrawArrowPair(gArrowPair);
}
/*----------------------------------------------------------------------------
TrackArrowClick
Track a click on the arrows user item.
Entry: dlg = pointer to dialog.
curTopic = current topic number.
Exit: function result = new topic number.
----------------------------------------------------------------------------*/
static short TrackArrowClick (DialogPtr dlg, short curTopic)
{
short itemType;
Rect box;
Handle itemHandle;
short delta;
short newTopic;
delta = TrackArrowPair(gArrowPair);
newTopic = curTopic + delta;
if (newTopic < 1) newTopic = 1;
if (newTopic > kNumTopics) newTopic = kNumTopics;
if (newTopic != curTopic) {
GetDialogItem(dlg, kTopicPopup, &itemType, &itemHandle, &box);
SetControlValue((ControlHandle)itemHandle, newTopic);
}
return newTopic;
}
/*----------------------------------------------------------------------------
DoPreferences
Presents the Preferences dialog.
Exit: function result = error code.
----------------------------------------------------------------------------*/
OSErr DoPreferences (void)
{
typedef OSErr (*prefsFuncPtr) (TPrefRec *prefs, DialogPtr dlg, short item);
static prefsFuncPtr prefsFuncPtrs[] = {
NewsreadingOptions,
Server,
ServerOptions,
Personal,
Signature,
MessageOptions,
ExtraHeaderLines,
Remote,
ScreenFonts,
PrintingFont,
SavedUGL,
SavedArt,
SavedMsg,
URLHelpers,
Auth,
Extract,
MiscOptions,
};
static short curTopic = kNewsreadingOptions;
short newTopic;
prefsFuncPtr theFunc;
TPrefRec *prefs = nil;
DialogPtr dlg = nil;
Boolean reauthenticate = false;
Handle theDITL;
Point newLocn;
OSErr err = noErr;
GrafPtr port;
short itemType;
Handle itemHandle;
Rect box, arrowRect, backwardHotRect, forwardHotRect;
GetPort(&port);
gArrowPair = nil;
MyICReadSharedPrefs(kICAllSharedPrefs);
err = MyNewPtr(sizeof(TPrefRec), &prefs);
if (err != noErr) goto exit;
*prefs = gPrefs;
if (prefs->savedMsgDefaultFolderAlias != nil) {
err = MyHandToHand(&prefs->savedMsgDefaultFolderAlias);
if (err != noErr) {
prefs->savedMsgDefaultFolderAlias = nil;
prefs->savedArtDefaultFolderAlias = nil;
prefs->savedBinDefaultFolderAlias = nil;
prefs->savedUGLDefaultFolderAlias = nil;
goto exit;
}
}
if (prefs->savedArtDefaultFolderAlias != nil) {
err = MyHandToHand(&prefs->savedArtDefaultFolderAlias);
if (err != noErr) {
prefs->savedArtDefaultFolderAlias = nil;
prefs->savedBinDefaultFolderAlias = nil;
prefs->savedUGLDefaultFolderAlias = nil;
goto exit;
}
}
if (prefs->savedBinDefaultFolderAlias != nil) {
err = MyHandToHand(&prefs->savedBinDefaultFolderAlias);
if (err != noErr) {
prefs->savedBinDefaultFolderAlias = nil;
prefs->savedUGLDefaultFolderAlias = nil;
goto exit;
}
}
if (prefs->savedUGLDefaultFolderAlias != nil) {
err = MyHandToHand(&prefs->savedUGLDefaultFolderAlias);
if (err != noErr) {
prefs->savedUGLDefaultFolderAlias = nil;
goto exit;
}
}
if (prefs->urlHelpers != nil) {
err = MyHandToHand(&prefs->urlHelpers);
if (err != noErr) {
prefs->urlHelpers = nil;
goto exit;
}
}
err = MyGetNewDialog(kPrefsDlg, ok, cancel, &dlg);
if (err != noErr) goto exit;
SetPort(dlg);
RestoreMovableModalDialogPosition(dlg, gPrefs.prefsLoc);
GetDialogItem(dlg, kArrows, &itemType, &itemHandle, &box);
SetRect(&arrowRect, box.left + 2, box.top + 3, box.left + 12, box.top + 21);
backwardHotRect = forwardHotRect = box;
backwardHotRect.bottom = forwardHotRect.top = box.top + 13;
backwardHotRect.top++;
forwardHotRect.bottom++;
err = CreateArrowPair(true, &arrowRect, &backwardHotRect,
&forwardHotRect, &gArrowPair);
if (err != noErr) goto exit;
EnableOrDisableArrowPair(gArrowPair, -1, curTopic > 1);
EnableOrDisableArrowPair(gArrowPair, +1, curTopic < kNumTopics);
for (gItem = kFirstGrayLine; gItem <= kLastGrayLine; gItem++)
DlgSetUserItem(dlg, gItem, gDlgGrayBorderItemUPP);
DlgSetUserItem(dlg, kArrows, gDlgArrowsItemUPP);
if (curTopic == kScreenFonts || curTopic == kPrintingFont) SetCursor(&gWatchCurs);
err = MyGetResource('DITL', kPrefsDlg + curTopic, &theDITL);
if (err == noErr) err = MyAppendDITL(dlg, theDITL, overlayDITL);
InitCursor();
if (err != noErr) goto exit;
MyReleaseResource(theDITL);
DlgSetCtlValue(dlg, kTopicPopup, curTopic);
theFunc = prefsFuncPtrs[curTopic - 1];
err = (*theFunc)(prefs, dlg, kInit);
if (err != noErr) goto exit;
DlgSetDefaultButtonOutline(dlg, curTopic != kSignature && curTopic != kExtraHeaderLines);
while (true) {
MyMovableModalDialog(dlg,
curTopic == kURLHelpers ? URLHelpersFilter : DialogFilter,
&gItem);
if (gItem == ok || gItem == cancel) {
gValid = true;
err = (*theFunc)(prefs, dlg, kTerm);
if (err != noErr) goto exit;
if (gValid || gItem == cancel) break;
} else if (gItem == kTopicPopup || gItem == kArrows) {
if (gItem == kTopicPopup) {
newTopic = DlgGetCtlValue(dlg, kTopicPopup);
} else {
newTopic = TrackArrowClick(dlg, curTopic);
}
if (newTopic != curTopic) {
gValid = true;
err = (*theFunc)(prefs, dlg, kTerm);
if (err != noErr) goto exit;
if (gValid) {
curTopic = newTopic;
EnableOrDisableArrowPair(gArrowPair, -1, curTopic > 1);
EnableOrDisableArrowPair(gArrowPair, +1, curTopic < kNumTopics);
MyShortenDITL(dlg, CountDITL(dlg) - kCommonItems);
if (curTopic == kScreenFonts || curTopic == kPrintingFont) SetCursor(&gWatchCurs);
err = MyGetResource('DITL', kPrefsDlg + curTopic, &theDITL);
if (err == noErr) err = MyAppendDITL(dlg, theDITL, overlayDITL);
InitCursor();
if (err != noErr) goto exit;
MyReleaseResource(theDITL);
theFunc = prefsFuncPtrs[curTopic - 1];
err = (*theFunc)(prefs, dlg, kInit);
if (err != noErr) goto exit;
DlgSetDefaultButtonOutline(dlg,
curTopic != kSignature && curTopic != kExtraHeaderLines);
} else {
GetDialogItem(dlg, kTopicPopup, &itemType, &itemHandle, &box);
SetControlValue((ControlHandle)itemHandle, curTopic);
}
}
} else {
err = (*theFunc)(prefs, dlg, gItem);
if (err != noErr) goto exit;
}
}
SaveMovableModalDialogPosition(dlg, &newLocn);
DisposeArrowPair(gArrowPair);
gArrowPair = nil;
err = DoClose(dlg);
dlg = nil;
if (err != noErr) goto exit;
if (gItem == ok) {
if (prefs->logActionsToFile && !gPrefs.logActionsToFile) {
OpenLogFile();
} else if (!prefs->logActionsToFile && gPrefs.logActionsToFile) {
CloseLogFile();
}
if (!EqualString(prefs->newsServerName, gPrefs.newsServerName, false, true)) {
NoteMessageNumber(kStrMustRestart);
}
if (prefs->useInternetConfig != gPrefs.useInternetConfig) {
NoteMessageNumber(kStrMustRestartIC);
}
reauthenticate = strcmp(prefs->authUsername, gPrefs.authUsername) != 0 ||
strcmp(prefs->authPassword, gPrefs.authPassword) != 0 ||
prefs->authAtStartup && !gPrefs.authAtStartup;
MyDisposeHandle(gPrefs.savedMsgDefaultFolderAlias);
MyDisposeHandle(gPrefs.savedArtDefaultFolderAlias);
MyDisposeHandle(gPrefs.savedBinDefaultFolderAlias);
MyDisposeHandle(gPrefs.savedUGLDefaultFolderAlias);
MyDisposeHandle(gPrefs.urlHelpers);
gPrefs = *prefs;
MyICWriteSharedPrefs(kICAllSharedPrefs);
ResetNewsServerOptions();
AdjustExtractBinariesCommand();
} else {
MyDisposeHandle(prefs->savedMsgDefaultFolderAlias);
MyDisposeHandle(prefs->savedArtDefaultFolderAlias);
MyDisposeHandle(prefs->savedBinDefaultFolderAlias);
MyDisposeHandle(prefs->savedUGLDefaultFolderAlias);
MyDisposeHandle(prefs->urlHelpers);
}
MyDisposePtr(prefs);
prefs = nil;
gPrefs.prefsLoc = newLocn;
if (reauthenticate && gStartupOK) {
err = ReAuthenticate();
if (err != noErr) goto exit;
if (gPrefs.authPrivateGroups) {
err = DoRebuildFullGroupList();
if (err != noErr) goto exit;
}
}
SetPort(port);
return noErr;
exit:
if (gArrowPair != nil) DisposeArrowPair(gArrowPair);
if (dlg != nil) DoClose(dlg);
if (prefs != nil) {
MyDisposeHandle(prefs->savedMsgDefaultFolderAlias);
MyDisposeHandle(prefs->savedArtDefaultFolderAlias);
MyDisposeHandle(prefs->savedBinDefaultFolderAlias);
MyDisposeHandle(prefs->savedUGLDefaultFolderAlias);
MyDisposeHandle(prefs->urlHelpers);
MyDisposePtr(prefs);
}
SetPort(port);
return err;
}
/*----------------------------------------------------------------------------
prefsdlog_InitUPP
Initialize UPPs.
----------------------------------------------------------------------------*/
void prefsdlog_InitUPP (void)
{
gInvisibleFilesFilterUPP = NewFileFilterYDProc(InvisibleFilesFilter);
gDrawFontSampleUPP = NewUserItemProc(DrawFontSample);
gDlgArrowsItemUPP = NewUserItemProc(DrawArrows);
gDrawURLListUPP = NewUserItemProc(DrawURLList);
}